থ্রেড তৈরি এবং ম্যানেজ করা

Computer Programming - সি++ প্রোগ্রামিং (C++ Programming) মাল্টিথ্রেডিং |
220
220

C++ এ মাল্টিথ্রেডিং ব্যবহারের মাধ্যমে একাধিক কাজ একযোগে সম্পন্ন করা যায়। থ্রেড তৈরি, ম্যানেজ করা, এবং থ্রেডের সাথে যোগাযোগ করার জন্য <thread> লাইব্রেরি এবং std::thread ক্লাস ব্যবহার করা হয়। প্রতিটি থ্রেড আলাদা একটি ফাংশন বা কোডের অংশ সম্পাদন করে।

থ্রেড তৈরি

C++ এ থ্রেড তৈরি করতে std::thread ক্লাস ব্যবহার করা হয়। থ্রেড তৈরি করার সময় ফাংশন, মেম্বার ফাংশন, বা ল্যাম্বডা ফাংশন প্রদান করা হয়, যা থ্রেডটি সম্পাদন করবে।

উদাহরণ: ফাংশন ব্যবহার করে থ্রেড তৈরি

#include <iostream>
#include <thread>
using namespace std;

void printMessage() {
    cout << "Hello from thread!" << endl;
}

int main() {
    thread t(printMessage); // থ্রেড t তৈরি এবং printMessage ফাংশন কল

    t.join(); // থ্রেড t শেষ হওয়া পর্যন্ত অপেক্ষা

    cout << "Main function ends." << endl;
    return 0;
}

বর্ণনা:

  • এখানে t নামে একটি থ্রেড তৈরি করা হয়েছে, যা printMessage ফাংশন সম্পাদন করবে।
  • t.join() দিয়ে থ্রেডটি শেষ হওয়া পর্যন্ত মেইন থ্রেড অপেক্ষা করবে।

আউটপুট:

Hello from thread!
Main function ends.

ল্যাম্বডা ফাংশন ব্যবহার করে থ্রেড তৈরি

ল্যাম্বডা ফাংশনের মাধ্যমে থ্রেড তৈরি করলে কোড আরও সংক্ষিপ্ত ও সহজ হয়।

#include <iostream>
#include <thread>
using namespace std;

int main() {
    thread t([]() {
        cout << "Hello from lambda thread!" << endl;
    });

    t.join(); // থ্রেড t শেষ হওয়া পর্যন্ত অপেক্ষা

    cout << "Main function ends." << endl;
    return 0;
}

বর্ণনা:

  • এখানে একটি ল্যাম্বডা ফাংশন ব্যবহার করে থ্রেড t তৈরি করা হয়েছে, যা একটি ছোট কাজ সম্পন্ন করছে।
  • join() এর মাধ্যমে থ্রেড শেষ হওয়া পর্যন্ত মেইন থ্রেড অপেক্ষা করছে।

মেম্বার ফাংশন ব্যবহার করে থ্রেড তৈরি

কোনো ক্লাসের মেম্বার ফাংশনকেও থ্রেড হিসেবে ব্যবহার করা যায়।

#include <iostream>
#include <thread>
using namespace std;

class Worker {
public:
    void printMessage() {
        cout << "Hello from member function!" << endl;
    }
};

int main() {
    Worker worker;
    thread t(&Worker::printMessage, &worker); // মেম্বার ফাংশন দিয়ে থ্রেড তৈরি

    t.join(); // থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা
    cout << "Main function ends." << endl;
    return 0;
}

বর্ণনা:

  • Worker ক্লাসের printMessage মেম্বার ফাংশন থ্রেড t এর মাধ্যমে কল করা হয়েছে।
  • &Worker::printMessage এর মাধ্যমে মেম্বার ফাংশন থ্রেডে পাস করা হয়েছে এবং &worker এর মাধ্যমে সেই ক্লাসের অবজেক্টটি প্রদান করা হয়েছে।

থ্রেড ম্যানেজমেন্ট অপারেশন

  1. join(): join() মেথডের মাধ্যমে একটি থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা করা হয়।
  2. detach(): detach() মেথড ব্যবহার করে একটি থ্রেড ব্যাকগ্রাউন্ডে চালাতে দেওয়া হয়, এবং মেইন থ্রেড অবাধে চলতে পারে।
  3. joinable(): joinable() চেক করে যে থ্রেডটি join() করার জন্য প্রস্তুত কিনা।

উদাহরণ: detach এবং joinable ব্যবহার

#include <iostream>
#include <thread>
using namespace std;

void backgroundTask() {
    cout << "Background task running..." << endl;
}

int main() {
    thread t(backgroundTask);

    if (t.joinable()) {
        t.detach(); // থ্রেড ব্যাকগ্রাউন্ডে চলে যাবে
    }

    cout << "Main function ends." << endl;
    return 0;
}

বর্ণনা:

  • এখানে t থ্রেড detach() মেথড ব্যবহার করে ব্যাকগ্রাউন্ডে চলে গেছে।
  • joinable() চেক করা হয়েছে যে থ্রেডটি join করার যোগ্য কিনা।

আউটপুট:

Background task running...
Main function ends.

একাধিক থ্রেড পরিচালনা

একই প্রোগ্রামে একাধিক থ্রেড তৈরি করে তাদের একযোগে চালানো যায়।

#include <iostream>
#include <thread>
using namespace std;

void task1() {
    for (int i = 1; i <= 5; i++) {
        cout << "Task 1 - Count: " << i << endl;
    }
}


void task2() {
    for (int i = 1; i <= 5; i++) {
        cout << "Task 2 - Count: " << i << endl;
    }
}

int main() {
    thread t1(task1); // প্রথম থ্রেড
    thread t2(task2); // দ্বিতীয় থ্রেড

    t1.join(); // প্রথম থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা
    t2.join(); // দ্বিতীয় থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা

    cout << "Both tasks completed." << endl;
    return 0;
}

বর্ণনা:

  • এখানে দুটি থ্রেড t1 এবং t2 তৈরি করা হয়েছে, যা task1 এবং task2 ফাংশন চালাবে।
  • t1.join() এবং t2.join() দিয়ে উভয় থ্রেড শেষ হওয়া পর্যন্ত মেইন থ্রেড অপেক্ষা করছে।

আউটপুট (পরিকল্পিত নয়):

Task 1 - Count: 1
Task 2 - Count: 1
Task 1 - Count: 2
Task 2 - Count: 2
...
Both tasks completed.

মাল্টিথ্রেডিং ব্যবহারে সতর্কতা

  1. ডেটা রেস এড়ানো: একাধিক থ্রেড একই ডেটা অ্যাক্সেস করলে ডেটা রেস হতে পারে। এটি প্রতিরোধ করতে mutex ব্যবহার করা হয়।
  2. ডেডলক প্রতিরোধ: একাধিক mutex ব্যবহারের সময় ডেডলক সমস্যা হতে পারে। তাই সাবধানে lock এবং unlock ব্যবহার করতে হবে।
  3. থ্রেড ম্যানেজমেন্ট নিশ্চিত করা: প্রতিটি থ্রেড শেষ হওয়ার জন্য join() বা ব্যাকগ্রাউন্ডে চালানোর জন্য detach() করা প্রয়োজন।

সারসংক্ষেপ

  • C++ এ std::thread ব্যবহার করে থ্রেড তৈরি করা যায়।
  • join(), detach(), এবং joinable() থ্রেড ম্যানেজমেন্টের জন্য ব্যবহৃত হয়।
  • মাল্টিথ্রেডিং ব্যবহারে mutex এবং ডেডলক প্রতিরোধ ব্যবস্থা গ্রহণ করা উচিত।

থ্রেড ব্যবহারে কার্যক্ষমতা বৃদ্ধি পায়, তবে এটি ব্যবহারে সতর্ক থাকা উচিত, কারণ থ্রেড পরিচালনার ভুলে প্রোগ্রাম ক্র্যাশ করতে পারে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion